package com.kede.app.service.impl;

import com.kede.app.domain.LeescoreGoodsType;
import com.kede.app.ienum.FunStatusEnum;
import com.kede.app.ienum.TypeLevel;
import com.kede.utils.ValidationUtil;
import com.kede.utils.FileUtil;
import lombok.RequiredArgsConstructor;
import com.kede.app.repository.LeescoreGoodsTypeRepository;
import com.kede.app.service.LeescoreGoodsTypeService;
import com.kede.app.service.dto.LeescoreGoodsTypeDto;
import com.kede.app.service.dto.LeescoreGoodsTypeQueryCriteria;
import com.kede.app.service.mapstruct.LeescoreGoodsTypeMapper;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import com.kede.utils.PageUtil;
import com.kede.utils.QueryHelp;
import java.util.List;
import java.util.Map;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;

/**
* @description 服务实现
* @author Pr.li
* @date 2023-05-23
**/
@Service
@RequiredArgsConstructor
public class LeescoreGoodsTypeServiceImpl implements LeescoreGoodsTypeService {

    private final LeescoreGoodsTypeRepository leescoreGoodsTypeRepository;
    private final LeescoreGoodsTypeMapper leescoreGoodsTypeMapper;

    @Override
    public Map<String,Object> queryAll(LeescoreGoodsTypeQueryCriteria criteria, Pageable pageable){
        criteria.setType(TypeLevel.MASTER.getValue());
        Page<LeescoreGoodsType> page = leescoreGoodsTypeRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
        LeescoreGoodsType query = new LeescoreGoodsType();
        page.getContent().forEach(leescoreGoodsType -> {
            query.setPid(leescoreGoodsType.getId());
            long count = leescoreGoodsTypeRepository.count(Example.of(query));
            leescoreGoodsType.setHasChildren(count>0?true:false);
        });
        return PageUtil.toPage(page.map(leescoreGoodsTypeMapper::toDto));
    }

    @Override
    public List<LeescoreGoodsTypeDto> querySlaveAll(Integer pid){
        LeescoreGoodsType leescoreGoodsType = new LeescoreGoodsType();
        leescoreGoodsType.setType(TypeLevel.SLAVE.getValue());
        leescoreGoodsType.setPid(pid);
        List<LeescoreGoodsType> all = leescoreGoodsTypeRepository.findAll(Example.of(leescoreGoodsType));
        return leescoreGoodsTypeMapper.toDto(all);
    }

    @Override
    public List<LeescoreGoodsTypeDto> queryAll(LeescoreGoodsTypeQueryCriteria criteria){
        return leescoreGoodsTypeMapper.toDto(leescoreGoodsTypeRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
    }

    @Override
    @Transactional
    public LeescoreGoodsTypeDto findById(Integer id) {
        LeescoreGoodsType leescoreGoodsType = leescoreGoodsTypeRepository.findById(id).orElseGet(LeescoreGoodsType::new);
        ValidationUtil.isNull(leescoreGoodsType.getId(),"LeescoreGoodsType","id",id);
        return leescoreGoodsTypeMapper.toDto(leescoreGoodsType);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public LeescoreGoodsTypeDto create(LeescoreGoodsType resources) {
        return leescoreGoodsTypeMapper.toDto(leescoreGoodsTypeRepository.save(resources));
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(LeescoreGoodsType resources) {
        LeescoreGoodsType leescoreGoodsType = leescoreGoodsTypeRepository.findById(resources.getId()).orElseGet(LeescoreGoodsType::new);
        ValidationUtil.isNull( leescoreGoodsType.getId(),"LeescoreGoodsType","id",resources.getId());
        leescoreGoodsType.copy(resources);
        leescoreGoodsTypeRepository.save(leescoreGoodsType);
    }

    @Override
    public void deleteAll(Integer[] ids) {
        for (Integer id : ids) {
            leescoreGoodsTypeRepository.deleteById(id);
        }
    }

    @Override
    public void download(List<LeescoreGoodsTypeDto> all, HttpServletResponse response) throws IOException {
        List<Map<String, Object>> list = new ArrayList<>();
        for (LeescoreGoodsTypeDto leescoreGoodsType : all) {
            Map<String,Object> map = new LinkedHashMap<>();
            map.put("主选项id", leescoreGoodsType.getPid());
            map.put("选项名称", leescoreGoodsType.getName());
            map.put("选项别名，用于快速查找name", leescoreGoodsType.getTag());
            map.put("选项状态  1启动 2禁用", leescoreGoodsType.getStatus());
            map.put("1 主选项 2子选项", leescoreGoodsType.getType());
            map.put(" createTime",  leescoreGoodsType.getCreateTime());
            map.put(" updateTime",  leescoreGoodsType.getUpdateTime());
            list.add(map);
        }
        FileUtil.downloadExcel(list, response);
    }

    @Override
    public List<LeescoreGoodsTypeDto> getMasterLable() {
        LeescoreGoodsType leescoreGoodsType = new LeescoreGoodsType();
        leescoreGoodsType.setType(TypeLevel.MASTER.getValue());
        leescoreGoodsType.setStatus(FunStatusEnum.ON.getValue());
        List<LeescoreGoodsType> all = leescoreGoodsTypeRepository.findAll(Example.of(leescoreGoodsType));
        return leescoreGoodsTypeMapper.toDto(all);
    }
}